home *** CD-ROM | disk | FTP | other *** search
- #include <SetUpA4.h>
-
- #define SystemTaskTrap 0xA9B4
- #define SystemMenuTrap 0xA9B5
-
- #define aeSelectionKeyword 'fsel'
- #define aeOpenSelection 'sope'
- #define kFinderSig 'FNDR'
- #define kSystemType 'MACS'
-
- #define SaveRegs() asm {MOVEM.L A0-A5/D0-D7, -(A7)}
- #define RestoreRegs() asm {MOVEM.L (A7)+, A0-A5/D0-D7}
-
-
- void main (void);
- pascal void newSystemTask (void);
- pascal void newSystemMenu (long);
- void LaunchItems (short);
- OSErr FindAProcess (OSType, OSType, ProcessSerialNumberPtr);
- void AddFinderMenu (void);
- extern pascal void ShowINIT (short, short);
-
-
- MenuHandle theMenuResHndl=nil;
- Ptr oldSystemTask;
- Ptr oldSystemMenu;
- short theMenuResID=-13;
-
-
-
- void main ()
- {
- Handle initHndl=nil;
- Ptr initPtr;
-
- asm
- {
- move.l a0, initPtr
- }
-
-
- RememberA0();
- SetUpA4();
-
- initHndl=RecoverHandle (initPtr);
- DetachResource (initHndl);
-
- AddFinderMenu ();
-
- oldSystemTask=StripAddress ((Ptr) NGetTrapAddress (SystemTaskTrap, ToolTrap));
- NSetTrapAddress ((long) newSystemTask, SystemTaskTrap, ToolTrap);
-
- ShowINIT (256, -1);
-
- RestoreA4();
- }
-
-
- pascal void newSystemTask ()
- {
- Handle mdefHndl;
- Ptr oldSystemTaskPtr;
- static Boolean flagWNE=true;
- Boolean finder;
-
- SaveRegs();
- SetUpA4();
-
- oldSystemTaskPtr=oldSystemTask;
-
- finder=EqualString (FinderName, CurApName, false, false);
-
- if (finder)
- {
- if (flagWNE)
- {
- flagWNE=false;
-
- mdefHndl=GetResource ('MDEF', 0);
- (**theMenuResHndl).menuProc=mdefHndl;
- CalcMenuSize (theMenuResHndl);
- InsertMenu (theMenuResHndl, 0);
- DrawMenuBar ();
-
- oldSystemMenu=StripAddress ((Ptr) NGetTrapAddress (SystemMenuTrap, ToolTrap));
- NSetTrapAddress ((long) newSystemMenu, SystemMenuTrap, ToolTrap);
- }
- }
-
- RestoreA4();
- RestoreRegs();
-
- asm
- {
- move.l oldSystemTaskPtr, a0
- unlk a6
- jmp (a0)
- }
- }
-
-
-
- pascal void newSystemMenu (long menuResult)
- {
- Ptr oldSystemMenuPtr;
- Boolean test;
- short menuID, menuItem;
- short appleMenuItem=1, controlPanelsItem=2, extensionsItem=3, preferencesItem=4, startupItem=5;
-
- SaveRegs();
- SetUpA4();
-
- oldSystemMenuPtr=oldSystemMenu;
-
- menuID=HiWord (menuResult);
- menuItem=LoWord (menuResult);
-
- test=EqualString (FinderName, CurApName, false, false);
-
- if (test)
- {
- if (menuID == theMenuResID)
- {
- if (menuItem == appleMenuItem || menuItem == controlPanelsItem || menuItem == extensionsItem ||
- menuItem == preferencesItem || menuItem == startupItem)
- {
- menuResult=0;
- LaunchItems (menuItem);
- }
-
- }
- }
-
- RestoreA4();
- RestoreRegs();
-
- asm
- {
- move.l oldSystemMenuPtr, a0
- unlk a6
- jmp (a0)
- }
- }
-
-
-
-
- void LaunchItems (short itemNum)
- {
- OSErr err;
- ProcessSerialNumber process;
- AppleEvent aeEvent;
- AEDesc theAddressDesc, aeDirDesc, fileList, listElem;
- FSSpec theDocToOpen, dirSpec;
- CInfoPBRec dirBlock, fileBlock;
- AliasHandle dirAliasHndl=nil, fileAliasHndl=nil;
- Str255 dirName, fileName, errStrng2, errStrng3;
- Boolean test;
- long foundDirID, parID, theFolderType;
- short i, j, defaultVol=0, numFiles, foundVRefNum;
-
- SetUpA4();
-
- switch (itemNum)
- {
- case 1:
- theFolderType=kAppleMenuFolderType;
- break;
- case 2:
- theFolderType=kControlPanelFolderType;
- break;
- case 3:
- theFolderType=kExtensionFolderType;
- break;
- case 4:
- theFolderType=kPreferencesFolderType;
- break;
- case 5:
- theFolderType=kStartupFolderType;
- break;
- }
-
- err=FindFolder (defaultVol, theFolderType, kOnSystemDisk, &foundVRefNum, &foundDirID);
-
- if (err != noErr)
- goto Exit;
-
- dirBlock.dirInfo.ioCompletion=nil;
- dirBlock.dirInfo.ioNamePtr=dirName;
- dirBlock.dirInfo.ioVRefNum=defaultVol;
- dirBlock.dirInfo.ioFDirIndex=-1;
- dirBlock.dirInfo.ioDrDirID=foundDirID;
-
- err=PBGetCatInfoSync (&dirBlock);
-
- if (err != noErr)
- goto Exit;
-
- numFiles=dirBlock.dirInfo.ioDrNmFls;
-
- if (numFiles > 0)
- {
- parID=dirBlock.dirInfo.ioDrParID;
-
- fileBlock.hFileInfo.ioCompletion=nil;
- fileBlock.hFileInfo.ioNamePtr=fileName;
- fileBlock.hFileInfo.ioVRefNum=defaultVol;
- fileBlock.hFileInfo.ioFDirIndex=1;
- fileBlock.hFileInfo.ioDirID=foundDirID;
-
- err=PBGetCatInfoSync (&fileBlock);
-
- if (err != noErr)
- goto Exit;
-
- test=FindAProcess (kFinderSig, kSystemType, &process);
-
- theAddressDesc.descriptorType=0;
- theAddressDesc.dataHandle=nil;
- err=AECreateDesc (typeProcessSerialNumber, &process, sizeof (process), &theAddressDesc);
-
- if (err != noErr)
- goto Exit;;
-
- err=AECreateAppleEvent (kFinderSig, aeOpenSelection, &theAddressDesc,
- kAutoGenerateReturnID, kAnyTransactionID, &aeEvent);
-
- if (err != noErr)
- goto Exit;;
-
- theDocToOpen.vRefNum=defaultVol;
- theDocToOpen.parID=foundDirID;
-
- for (j=0;j<=fileBlock.hFileInfo.ioNamePtr[0];j++)
- theDocToOpen.name[j]=fileBlock.hFileInfo.ioNamePtr[j];
-
- err=FSMakeFSSpec (theDocToOpen.vRefNum, theDocToOpen.parID, nil, &dirSpec);
-
- if (err != noErr)
- goto Exit;
-
- err=NewAlias (nil, &dirSpec, &dirAliasHndl);
-
- if (err != noErr)
- goto Exit;
-
- HLock (dirAliasHndl);
-
- aeDirDesc.descriptorType=0;
- aeDirDesc.dataHandle =nil;
- err=AECreateDesc (typeAlias, *dirAliasHndl, GetHandleSize (dirAliasHndl), &aeDirDesc);
-
- if (err != noErr)
- goto Exit;
-
- HUnlock (dirAliasHndl);
- DisposHandle (dirAliasHndl);
-
- err=AEPutParamDesc(&aeEvent, keyDirectObject, &aeDirDesc);
-
- if (err != noErr)
- goto Exit;
-
- err=AEDisposeDesc (&aeDirDesc);
-
- if (err != noErr)
- goto Exit;
-
- fileList.descriptorType=0;
- fileList.dataHandle=nil;
- err=AECreateList (nil, 0, false, &fileList);
-
- if (err != noErr)
- goto Exit;
-
- for (i=1;i<=numFiles;i++)
- {
- fileBlock.hFileInfo.ioFDirIndex=i;
- fileBlock.hFileInfo.ioDirID=foundDirID;
-
- err=PBGetCatInfoSync (&fileBlock);
-
- if (err != noErr)
- goto Exit;
-
- theDocToOpen.vRefNum=defaultVol;
- theDocToOpen.parID=foundDirID;
-
- for (j=0;j<=fileBlock.hFileInfo.ioNamePtr[0];j++)
- theDocToOpen.name[j]=fileBlock.hFileInfo.ioNamePtr[j];
-
- err=FSMakeFSSpec(theDocToOpen.vRefNum, theDocToOpen.parID, nil, &dirSpec);
-
- if (err != noErr)
- goto Exit;
-
- err=NewAlias (nil, &theDocToOpen, &fileAliasHndl);
-
- if (err != noErr)
- goto Exit;
-
- HLock (fileAliasHndl);
- err=AECreateDesc (typeAlias, *fileAliasHndl, GetHandleSize (fileAliasHndl), &listElem);
-
- if (err != noErr)
- goto Exit;
-
- HUnlock (fileAliasHndl);
- DisposHandle (fileAliasHndl);
-
- err=AEPutDesc (&fileList, i, &listElem);
-
- if (err != noErr)
- goto Exit;
-
- err=AEDisposeDesc(&listElem);
-
- if (err != noErr)
- goto Exit;
-
- err=AEPutParamDesc (&aeEvent, aeSelectionKeyword, &fileList);
-
- if (err != noErr)
- goto Exit;
- }
-
- err=AEDisposeDesc (&fileList);
-
- if (err != noErr)
- goto Exit;
-
- err=AESend (&aeEvent, nil, kAENoReply + kAEAlwaysInteract + kAECanSwitchLayer,
- kAEHighPriority, kAEDefaultTimeout, nil, nil);
-
- if (err != noErr)
- goto Exit;
-
- err=AEDisposeDesc (&aeEvent);
- }
-
- Exit:
-
- if (err != noErr)
- DebugStr ("\pAn Error has occurred");
-
- RestoreA4();
- }
-
-
- OSErr FindAProcess (OSType typeToFind, OSType creatorToFind, ProcessSerialNumberPtr processSN)
- {
- ProcessInfoRec tempInfo;
- FSSpec procSpec;
- Str31 processName;
- OSErr err = noErr;
-
- processSN->lowLongOfPSN = kNoProcess;
- processSN->highLongOfPSN = kNoProcess;
-
- tempInfo.processInfoLength = sizeof(ProcessInfoRec);
- tempInfo.processName = (StringPtr) &processName;
- tempInfo.processAppSpec = &procSpec;
-
- do
- {
- err = GetNextProcess(processSN);
-
- if (err == noErr)
- GetProcessInformation(processSN, &tempInfo);
-
- }while ((tempInfo.processSignature != creatorToFind || tempInfo.processType != typeToFind) || err != noErr);
-
- return(err);
- }
-
-
-
- void AddFinderMenu ()
- {
- SetUpA4();
-
- theMenuResHndl=(MenuHandle) Get1IndResource ('MENU', 1);
- HLock (theMenuResHndl);
- DetachResource (theMenuResHndl);
-
- RestoreA4();
- }
-
-
-
-
-
-
-